<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
	<meta name="keywords" content="nacos-confd" />
	<meta name="description" content="nacos-confd" />
	<!-- 网页标签标题 -->
	<title>nacos-confd</title>
	<link rel="shortcut icon" href="https://img.alicdn.com/tfs/TB1hgJpHAPoK1RjSZKbXXX1IXXa-64-64.png"/>
	<link rel="stylesheet" href="/build/blogDetail.css" />
</head>
<body>
	<div id="root"><div class="blog-detail-page" data-reactroot=""><header class="header-container header-container-normal"><div class="header-body"><a href="/en-us/index.html"><img class="logo" src="/img/nacos_colorful.png"/></a><div class="search search-normal"><span class="icon-search"></span></div><span class="language-switch language-switch-normal">中</span><div class="header-menu"><img class="header-menu-toggle" src="/img/menu_gray.png"/><ul><li class="menu-item menu-item-normal"><a href="/en-us/index.html">HOME</a></li><li class="menu-item menu-item-normal"><a href="/en-us/docs/quick-start.html">DOCS</a></li><li class="menu-item menu-item-normal menu-item-normal-active"><a href="/en-us/blog">BLOG</a></li><li class="menu-item menu-item-normal"><a href="/en-us/community">COMMUNITY</a></li><li class="menu-item menu-item-normal"><a href="https://cn.aliyun.com/product/aliware/mse?spm=nacos-website.topbar.0.0.0">NACOS IN CLOUD</a><img class="menu-img" src="https://img.alicdn.com/tfs/TB1esl_m.T1gK0jSZFrXXcNCXXa-200-200.png"/></li><li class="menu-item menu-item-normal"><a href="http://console.nacos.io/nacos/index.html">DEMO-CONSOLE</a></li></ul></div></div></header><section class="blog-content markdown-body"><p>为什么要支持confd，老的应用配置管理模式是启动时读取配置文件，然后重新读取配置文件需要应用重启。一般的配置管理系统都是代码侵入性的，应用接入配置管理系统都需要使用对应的SDK来查询和监听数据的变更。对于一些已经成熟的系统来说，接入SDK来实现动态配置管理是很难实现的，Nacos通过引入配置管理工具confd可以实现系统的配置变更做到无代码侵入性。</p>
<p>confd是一个轻量级的配置管理工具，可以通过查询后端存储系统来实现第三方系统的动态配置管理，如Nginx、Tomcat、HAproxy、Docker配置等。confd目前支持的后端有etcd、ZooKeeper等，Nacos
1.1版本通过对confd定制支持Nacos作为后端存储。</p>
<p>confd能够查询和监听后端系统的数据变更，结合配置模版引擎动态更新本地配置文件，保持和后端系统的数据一致，并且能够执行命令或者脚本实现系统的reload或者重启。</p>
<h2>安装confd插件</h2>
<p>confd的安装可以通过源码安装方式，confd基于Go语言编写，其编译安装依赖Go，首先需要确保本地安装了Go，版本不低于v1.10
创建confd目录，下载confd源码，编译生成可执行文件</p>
<pre><code>mkdir -p $GOPATH/src/github.com/kelseyhightower
cd $GOPATH/src/github.com/kelseyhightower
wget https://github.com/nacos-group/nacos-confd/archive/v0.19.1.tar.gz
tar -xvf v0.19.1.tar.gz
mv nacos-confd-0.19.1 confd
cd confd
make
</code></pre>
<p>复制confd文件到bin目录下，启动confd</p>
<pre><code>sudo cp bin/confd /usr/local/bin
confd
</code></pre>
<h2>confd结合Nacos实现nginx配置管理示例</h2>
<p>本文介绍使用Nacos结合confd实现Nginx配置管理，为简单起见以Nginx的黑名单功能为演示示例，Nacos使用官网部署的服务，<a href="http://xn--console-e73k064bojj.nacos.io">域名为console.nacos.io</a>。Nginx的安装可以参考网上文章</p>
<p><img src="https://img.alicdn.com/tfs/TB1X_KhdUz1gK0jSZLeXXb9kVXa-720-405.jpg" alt="image"></p>
<ul>
<li>1.创建confd所需目录</li>
</ul>
<p>confd配置文件默认在/etc/confd中，可以通过参数-confdir指定。目录中包含两个子目录，分别是：conf.d templates</p>
<pre><code>mkdir -p /etc/confd/{conf.d,templates}
</code></pre>
<ul>
<li>2.创建confd配置文件</li>
</ul>
<p>confd会先读取conf.d目录中的配置文件(toml格式)，然后根据文件指定的模板路径去渲染模板。</p>
<pre><code>vim /etc/confd/conf.d/nginx.toml
</code></pre>
<p>内容为如下，其中nginx.conf.tmpl文件为confd的模版文件，keys为模版渲染成配置文件所需的配置内容，/usr/local/nginx/conf/nginx.conf为生成的配置文件</p>
<pre><code>[template]
src = &quot; nginx.conf.tmpl&quot;
dest =
&quot;/usr/local/nginx/conf/nginx.conf&quot;
keys = [
&quot;/nginx/conf&quot;,
]
check_cmd = &quot;/usr/local/nginx/sbin/nginx -t
-c {{.src}}&quot;
reload_cmd = &quot;/usr/local/nginx/sbin/nginx
-s reload&quot;
</code></pre>
<ul>
<li>3.创建模版文件</li>
</ul>
<p>拷贝Nginx原始的配置，增加对应的渲染内容</p>
<pre><code>cp /usr/local/nginx/conf/nginx.conf
/etc/confd/templates/nginx.conf.tmpl
vim /etc/confd/templates/nginx.conf.tmpl
</code></pre>
<p>增加内容为:</p>
<pre><code>···
{{$data := json (getv &quot;/nginx/conf&quot;)}}
{{range $data.blackList}}
deny {{.}};
{{end}}
···
</code></pre>
<ul>
<li>4.在Nacos上创建所需的配置文件</li>
</ul>
<p>在public命名空间创建dataId为nginx.conf的配置文件，group使用默认的DEFAULT_GROUP即可，配置内容为json格式</p>
<pre><code>{
&quot;blackList&quot;:[&quot;10.0.1.104&quot;,&quot;10.0.1.103&quot;]
}
</code></pre>
<p><img src="https://img.alicdn.com/tfs/TB1PSKwdKP2gK0jSZFoXXauIVXa-1986-1024.png" alt="image"></p>
<ul>
<li>5.启动confd</li>
</ul>
<p>启动confd，从Nacos获取配置文件，渲染Nginx配置文件。backend设置成nacos，node指定访问的Nacos服务地址，watch让confd支持动态监听</p>
<pre><code>confd -backend nacos -node http://console.nacos.io:80 -watch
</code></pre>
<ul>
<li>6.查看Nginx配置文件，验证Nginx启动</li>
</ul>
<p>查看生成的/usr/local/nginx/conf/nginx.conf配置文件是否存在如下内容</p>
<pre><code>...
deny 10.0.1.104;

deny 10.0.1.103;
...
</code></pre>
<p>curl命令访问Nginx，验证是否返回正常。http响应状态码为200说明访问Nginx正常</p>
<pre><code>curl http://$IP:8080/ -i
HTTP/1.1 200 OK
...
</code></pre>
<ul>
<li>7.查看本机Ip，加到Nacos配置文件黑名单中</li>
</ul>
<p>假设本机的Ip为30.5.125.107，将本机的Ip加入到Nginx黑名单</p>
<pre><code>{
&quot;blackList&quot;:[&quot;10.0.1.104&quot;,&quot;10.0.1.103&quot;,&quot;30.5.125.107&quot;]
}
</code></pre>
<ul>
<li>8.查看Nginx配置文件，验证黑名单是否生效</li>
</ul>
<p>查看生成的/usr/local/nginx/conf/nginx.conf配置文件是否存在如下内容</p>
<pre><code>...
deny 10.0.1.104;

deny 10.0.1.103;

deny 30.5.125.107;
...
</code></pre>
<p>curl命令访问Nginx，访问应该被拒绝，返回403</p>
<pre><code>curl http://$IP:8080/ -i
HTTP/1.1 403 Forbidden
...
</code></pre>
<h2>总结</h2>
<p>本文介绍了使用Nacos结合confd来做自动化管理，confd作为轻量级的配置管理工具可以做到对第三方系统无代码侵入性。本文只是简单使用Nginx的黑名单功能来演示Nacos+confd的使用方式，当然Nginx还具有限流、反向代理等功能以及其他的系统比如Naproxy、Tomcat、Docker等也同样可以使用Nacos+confd做管理，大家可以到Nacos<a href="https://nacos.io">官网</a>贡献相应的demo或者方案。</p>
</section><footer class="footer-container"><div class="footer-body"><img src="/img/nacos_gray.png"/><div class="cols-container"><div class="col col-12"><h3>Vision</h3><p>By providing an easy-to-use service infrastructure such as dynamic service discovery, service configuration, service sharing and management and etc., Nacos help users better construct, deliver and manage their own service platform, reuse and composite business service faster and deliver value of business innovation more quickly so as to win market for users in the era of cloud native and in all cloud environments, such as private, mixed, or public clouds.</p></div><div class="col col-6"><dl><dt>Documentation</dt><dd><a href="/en-us/docs/what-is-nacos.html" target="_self">Overview</a></dd><dd><a href="/en-us/docs/quick-start.html" target="_self">Quick start</a></dd><dd><a href="/en-us/docs/contributing.html" target="_self">Developer guide</a></dd></dl></div><div class="col col-6"><dl><dt>Resources</dt><dd><a href="/en-us/community/index.html" target="_self">Community</a></dd><dd><a href="https://cn.aliyun.com/product/aliware/mse?spm=nacos-website.topbar.0.0.0" target="_self">Cloud Service MSE</a></dd><dd><a href="https://www.aliyun.com/product/edas?source_type=nacos_pc_20181219" target="_self">Cloud Service EDAS</a></dd><dd><a href="https://www.aliyun.com/product/ahas?source_type=nacos_pc_20190225" target="_self">Cloud Service AHAS</a></dd></dl></div></div><div class="copyright"><span>@ 2018 The Nacos Authors | An Alibaba Middleware (Aliware) Project</span></div></div></footer></div></div>
	<script src="https://f.alicdn.com/react/15.4.1/react-with-addons.min.js"></script>
	<script src="https://f.alicdn.com/react/15.4.1/react-dom.min.js"></script>
	<script>
		window.rootPath = '';
  </script>
	<script src="/build/blogDetail.js"></script>
</body>
</html>